struct SelectorElement
{
SelectorElementType elem_type;
- GtkStateType state;
union
{
struct SelectorPath
{
GSList *elements;
+ GtkStateType state;
guint ref_count;
};
enum ParserScope {
SCOPE_SELECTOR,
+ SCOPE_PSEUDO_CLASS,
SCOPE_DECLARATION,
SCOPE_VALUE
};
SelectorPath *path;
path = g_slice_new0 (SelectorPath);
+ path->state = GTK_STATE_NORMAL;
path->ref_count = 1;
return path;
scanner = g_scanner_new (NULL);
/* scanner->input_name = path; */
+ g_scanner_scope_add_symbol (scanner, SCOPE_PSEUDO_CLASS, "active", GUINT_TO_POINTER (GTK_STATE_ACTIVE));
+ g_scanner_scope_add_symbol (scanner, SCOPE_PSEUDO_CLASS, "prelight", GUINT_TO_POINTER (GTK_STATE_PRELIGHT));
+ g_scanner_scope_add_symbol (scanner, SCOPE_PSEUDO_CLASS, "hover", GUINT_TO_POINTER (GTK_STATE_PRELIGHT));
+ g_scanner_scope_add_symbol (scanner, SCOPE_PSEUDO_CLASS, "selected", GUINT_TO_POINTER (GTK_STATE_SELECTED));
+ g_scanner_scope_add_symbol (scanner, SCOPE_PSEUDO_CLASS, "insensitive", GUINT_TO_POINTER (GTK_STATE_INSENSITIVE));
+
priv->scanner = scanner;
css_provider_apply_scope (css_provider, SCOPE_SELECTOR);
}
{
guint64 score;
GHashTable *style;
+ GtkStateType state;
};
static GtkStyleSet *
new.score = score;
new.style = info->style;
+ new.state = info->path->state;
for (j = 0; j < priority_info->len; j++)
{
g_hash_table_iter_init (&iter, info->style);
while (g_hash_table_iter_next (&iter, &key, &value))
- gtk_style_set_set_property (set, key, GTK_STATE_NORMAL, value);
+ gtk_style_set_set_property (set, key, info->state, value);
}
g_array_free (priority_info, TRUE);
}
static GTokenType
-parse_selector (GScanner *scanner,
- SelectorPath **selector_out)
+parse_selector (GtkCssProvider *css_provider,
+ GScanner *scanner,
+ SelectorPath **selector_out)
{
SelectorPath *path;
return G_TOKEN_IDENTIFIER;
}
+ if (scanner->token == ':')
+ {
+ /* Pseudo-class scanning */
+ css_provider_push_scope (css_provider, SCOPE_PSEUDO_CLASS);
+ g_scanner_get_next_token (scanner);
+
+ if (scanner->token != G_TOKEN_SYMBOL)
+ {
+ selector_path_unref (path);
+ return G_TOKEN_SYMBOL;
+ }
+
+ path->state = GPOINTER_TO_INT (scanner->value.v_symbol);
+
+ g_scanner_get_next_token (scanner);
+ css_provider_pop_scope (css_provider);
+ }
+
*selector_out = path;
return G_TOKEN_NONE;
priv = GTK_CSS_PROVIDER_GET_PRIVATE (css_provider);
css_provider_push_scope (css_provider, SCOPE_SELECTOR);
- expected_token = parse_selector (scanner, &selector);
+ expected_token = parse_selector (css_provider, scanner, &selector);
if (expected_token != G_TOKEN_NONE)
return expected_token;
{
g_scanner_get_next_token (scanner);
- expected_token = parse_selector (scanner, &selector);
+ expected_token = parse_selector (css_provider, scanner, &selector);
if (expected_token != G_TOKEN_NONE)
return expected_token;